/*******************************************************************************
* Copyright (c) 2000, 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Marc R. Hoffmann <hoffmann@mountainminds.com> - Bug 284265 [JFace]
* DialogSettings.save() silently ignores IOException
*******************************************************************************/
package org.eclipse.jface.tests.dialogs;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;
import junit.framework.TestCase;
import org.eclipse.jface.dialogs.DialogSettings;
import org.eclipse.jface.dialogs.IDialogSettings;
public class DialogSettingsTest extends TestCase {
private static final float DELTA = 0.0000001f;
private static final String[] TEST_STRINGS = { "value",
" value with spaces ", "value.with.many.dots",
"value_with_underscores", "value<with<lessthan",
"value>with>greaterthan", "value&with&ersand",
"value\"with\"quote", "value#with#hash", "",
"\nvalue\nwith\nnewlines\n", "\tvalue\twith\ttab\t",
"\rvalue\rwith\rreturn\r", };
public void testDialogSettings() throws IOException {
for (String testString : TEST_STRINGS) {
final String name = testString;
testPutAndGetWithTitle(new DialogSettingsChecker() {
@Override
public void prepareAndCheckBeforeSerialization(
IDialogSettings dialogSettingsToSerialize) {
// nothing
}
@Override
public void checkAfterDeserialization(
IDialogSettings deserializedDialogSettings) {
assertEquals(name, deserializedDialogSettings.getName());
}
}, name);
}
}
public void testAddNewSection() throws IOException {
for (String testString : TEST_STRINGS) {
final String name = testString;
testPutAndGet(new DialogSettingsChecker() {
@Override
public void prepareAndCheckBeforeSerialization(
IDialogSettings dialogSettingsToSerialize) {
assertEquals(0,
dialogSettingsToSerialize.getSections().length);
assertEquals(null, dialogSettingsToSerialize
.getSection(name));
dialogSettingsToSerialize.addNewSection(name);
assertEquals(1,
dialogSettingsToSerialize.getSections().length);
assertNotNull(dialogSettingsToSerialize.getSection(name));
assertEquals(name, dialogSettingsToSerialize.getSection(
name).getName());
assertEquals(name,
dialogSettingsToSerialize.getSections()[0]
.getName());
}
@Override
public void checkAfterDeserialization(
IDialogSettings deserializedDialogSettings) {
assertEquals(1,
deserializedDialogSettings.getSections().length);
assertNotNull(deserializedDialogSettings.getSection(name));
assertEquals(name, deserializedDialogSettings.getSection(
name).getName());
assertEquals(name,
deserializedDialogSettings.getSections()[0]
.getName());
}
});
}
}
/**
* Helper method to fill a DialogSettings object to be checked later by
* check.
*
* @param memento
*/
private void fill(IDialogSettings dialogSettings) {
dialogSettings.put("booleanKey", true);
dialogSettings.put("floatKey", 0.4f);
dialogSettings.put("doubleKey", 0.5);
dialogSettings.put("integerKey", 324765);
dialogSettings.put("longKey", 1324765L);
dialogSettings.put("stringKey", "a string");
dialogSettings.put("stringArrayKey", new String[] { "some text data1",
"some text data2" });
final IDialogSettings section = dialogSettings.addNewSection("child1");
section.addNewSection("child2");
section.addNewSection("child3");
}
/**
* Helper method to check if the values set by fill are still there.
*
*/
protected void check(IDialogSettings dialogSettings) {
assertEquals(true, dialogSettings.getBoolean("booleanKey"));
assertEquals(0.4f, dialogSettings.getFloat("floatKey"), 0.4f);
assertEquals(0.4f, dialogSettings.getDouble("doubleKey"), 0.5);
assertEquals(324765, dialogSettings.getInt("integerKey"));
assertEquals(1324765L, dialogSettings.getLong("longKey"));
assertEquals("a string", dialogSettings.get("stringKey"));
String[] stringArray = dialogSettings.getArray("stringArrayKey");
assertEquals(2, stringArray.length);
assertEquals("some text data1", stringArray[0]);
assertEquals("some text data2", stringArray[1]);
IDialogSettings section = dialogSettings.getSection("child1");
assertNotNull(section);
assertNotNull(section.getSection("child2"));
assertNotNull(section.getSection("child3"));
}
public void testAddSection() throws IOException {
testPutAndGet(new DialogSettingsChecker() {
@Override
public void prepareAndCheckBeforeSerialization(
IDialogSettings dialogSettingsToSerialize) {
IDialogSettings section = new DialogSettings("some section");
fill(section);
check(section);
assertEquals("some section", section.getName());
dialogSettingsToSerialize.addSection(section);
}
@Override
public void checkAfterDeserialization(
IDialogSettings deserializedDialogSettings) {
final IDialogSettings section = deserializedDialogSettings
.getSection("some section");
assertNotNull(section);
assertEquals("some section", section.getName());
check(section);
}
});
}
public void testRemoveSection() {
DialogSettings dialogSettings = new DialogSettings(null);
IDialogSettings section = dialogSettings.addNewSection("new-section");
assertEquals(1, dialogSettings.getSections().length);
dialogSettings.removeSection(section);
assertEquals(0, dialogSettings.getSections().length);
}
public void testRemoveSectionByName() {
DialogSettings dialogSettings = new DialogSettings(null);
IDialogSettings section = dialogSettings.addNewSection("new-section");
assertEquals(1, dialogSettings.getSections().length);
final IDialogSettings removedSection = dialogSettings.removeSection("new-section");
assertEquals(0, dialogSettings.getSections().length);
assertEquals(section, removedSection);
}
public void testRemoveNonExistingSection() {
DialogSettings dialogSettings = new DialogSettings(null);
dialogSettings.addNewSection("new-section");
assertEquals(1, dialogSettings.getSections().length);
IDialogSettings otherSection = new DialogSettings(null);
dialogSettings.removeSection(otherSection);
assertEquals(1, dialogSettings.getSections().length);
}
public void testRemoveOtherSection() {
DialogSettings dialogSettings = new DialogSettings(null);
dialogSettings.addNewSection("new-section");
assertEquals(1, dialogSettings.getSections().length);
IDialogSettings otherSection = new DialogSettings("new-section");
dialogSettings.removeSection(otherSection);
assertEquals(1, dialogSettings.getSections().length);
}
public void testRemoveSectionWithNullArgument() {
DialogSettings dialogSettings = new DialogSettings(null);
try {
dialogSettings.removeSection((IDialogSettings)null);
} catch (NullPointerException expected) {
}
}
public void testKeys() throws IOException {
for (String testString : TEST_STRINGS) {
final String key = testString;
testPutAndGet(new DialogSettingsChecker() {
@Override
public void prepareAndCheckBeforeSerialization(
IDialogSettings dialogSettingsToSerialize) {
assertNull(dialogSettingsToSerialize.get(key));
dialogSettingsToSerialize.put(key, "some string");
assertEquals("some string", dialogSettingsToSerialize
.get(key));
}
@Override
public void checkAfterDeserialization(
IDialogSettings deserializedDialogSettings) {
assertEquals("some string", deserializedDialogSettings
.get(key));
}
});
}
}
public void testGet() throws IOException {
for (String testString : TEST_STRINGS) {
final String value = testString;
testPutAndGet(new DialogSettingsChecker() {
@Override
public void prepareAndCheckBeforeSerialization(
IDialogSettings dialogSettingsToSerialize) {
dialogSettingsToSerialize.put("someKey", value);
assertEquals(value, dialogSettingsToSerialize
.get("someKey"));
}
@Override
public void checkAfterDeserialization(
IDialogSettings deserializedDialogSettings) {
assertEquals(value, deserializedDialogSettings
.get("someKey"));
}
});
}
}
public void testGetArray() throws IOException {
for (String testString : TEST_STRINGS) {
final String value1 = testString;
for (String otherTestString : TEST_STRINGS) {
final String value2 = otherTestString;
final String[] value = new String[] { value1, value2 };
testPutAndGet(new DialogSettingsChecker() {
@Override
public void prepareAndCheckBeforeSerialization(
IDialogSettings dialogSettingsToSerialize) {
dialogSettingsToSerialize.put("someKey", value);
assertEquals(2, dialogSettingsToSerialize
.getArray("someKey").length);
assertEquals(value1, dialogSettingsToSerialize
.getArray("someKey")[0]);
assertEquals(value2, dialogSettingsToSerialize
.getArray("someKey")[1]);
dialogSettingsToSerialize.put("anotherKey1",
new String[] {});
// TODO see bug 98332, we should handle null cases too
// dialogSettingsToSerialize.put("anotherKey2",
// new String[] { null });
// dialogSettingsToSerialize.put("anotherKey3",
// new String[] { "string", null });
// dialogSettingsToSerialize.put("anotherKey4",
// new String[] { null, "string", null });
}
@Override
public void checkAfterDeserialization(
IDialogSettings deserializedDialogSettings) {
assertEquals(2, deserializedDialogSettings
.getArray("someKey").length);
assertEquals(value1, deserializedDialogSettings
.getArray("someKey")[0]);
assertEquals(value2, deserializedDialogSettings
.getArray("someKey")[1]);
assertEquals(0, deserializedDialogSettings
.getArray("anotherKey1").length);
// TODO see bug 98332, we should handle null cases too
// assertEquals(1, deserializedDialogSettings
// .getArray("anotherKey2").length);
// assertEquals(null, deserializedDialogSettings
// .getArray("anotherKey2")[0]);
// assertEquals(2, deserializedDialogSettings
// .getArray("anotherKey3").length);
// assertEquals("string", deserializedDialogSettings
// .getArray("anotherKey3")[0]);
// assertEquals(null, deserializedDialogSettings
// .getArray("anotherKey3")[1]);
// assertEquals(3, deserializedDialogSettings
// .getArray("anotherKey4").length);
// assertEquals(null, deserializedDialogSettings
// .getArray("anotherKey4")[0]);
// assertEquals("string", deserializedDialogSettings
// .getArray("anotherKey4")[1]);
// assertEquals(null, deserializedDialogSettings
// .getArray("anotherKey4")[2]);
}
});
}
}
}
public void testGetBoolean() throws IOException {
testPutAndGet(new DialogSettingsChecker() {
@Override
public void prepareAndCheckBeforeSerialization(
IDialogSettings dialogSettingsToSerialize) {
dialogSettingsToSerialize.put("true", true);
dialogSettingsToSerialize.put("false", false);
assertEquals(true, dialogSettingsToSerialize.getBoolean("true"));
assertEquals(false, dialogSettingsToSerialize
.getBoolean("false"));
}
@Override
public void checkAfterDeserialization(
IDialogSettings deserializedDialogSettings) {
assertEquals(true, deserializedDialogSettings
.getBoolean("true"));
assertEquals(false, deserializedDialogSettings
.getBoolean("false"));
}
});
}
public void testGetDouble() throws IOException {
final double[] values = new double[] { -3.1415, 1, 0, 4554.45235,
Double.MAX_VALUE, Double.MIN_VALUE, Double.NaN,
Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY };
for (double testValue : values) {
final double value = testValue;
testPutAndGet(new DialogSettingsChecker() {
@Override
public void prepareAndCheckBeforeSerialization(
IDialogSettings dialogSettingsToSerialize) {
dialogSettingsToSerialize.put("someKey", value);
final double d = dialogSettingsToSerialize
.getDouble("someKey");
if (Double.isNaN(value)) {
assertTrue(Double.isNaN(d));
} else {
assertEquals(value, d, DELTA);
}
}
@Override
public void checkAfterDeserialization(
IDialogSettings deserializedDialogSettings) {
final double d = deserializedDialogSettings
.getDouble("someKey");
if (Double.isNaN(value)) {
assertTrue(Double.isNaN(d));
} else {
assertEquals(value, d, DELTA);
}
}
});
}
}
public void testGetFloat() throws IOException {
final float[] values = new float[] { -3.1415f, 1, 0, 4554.45235f,
Float.MAX_VALUE, Float.MIN_VALUE, Float.NaN,
Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY };
for (float testValue : values) {
final float value = testValue;
testPutAndGet(new DialogSettingsChecker() {
@Override
public void prepareAndCheckBeforeSerialization(
IDialogSettings dialogSettingsToSerialize) {
dialogSettingsToSerialize.put("someKey", value);
final float f = dialogSettingsToSerialize
.getFloat("someKey");
if (Float.isNaN(value)) {
assertTrue(Float.isNaN(f));
} else {
assertEquals(value, f, DELTA);
}
}
@Override
public void checkAfterDeserialization(
IDialogSettings deserializedDialogSettings) {
final float f = deserializedDialogSettings
.getFloat("someKey");
if (Float.isNaN(value)) {
assertTrue(Float.isNaN(f));
} else {
assertEquals(value, f, DELTA);
}
}
});
}
}
public void testGetInt() throws IOException {
int[] values = new int[] { 36254, 0, 1, -36254, Integer.MAX_VALUE,
Integer.MIN_VALUE };
for (int testValue : values) {
final int value = testValue;
testPutAndGet(new DialogSettingsChecker() {
@Override
public void prepareAndCheckBeforeSerialization(
IDialogSettings dialogSettingsToSerialize) {
dialogSettingsToSerialize.put("someKey", value);
assertEquals(value, dialogSettingsToSerialize
.getInt("someKey"));
}
@Override
public void checkAfterDeserialization(
IDialogSettings deserializedDialogSettings) {
assertEquals(value, deserializedDialogSettings
.getInt("someKey"));
}
});
}
}
public void testGetLong() throws IOException {
long[] values = new long[] { 36254L, 0L, 1L, -36254L, Long.MAX_VALUE,
Long.MIN_VALUE };
for (long testValue : values) {
final long value = testValue;
testPutAndGet(new DialogSettingsChecker() {
@Override
public void prepareAndCheckBeforeSerialization(
IDialogSettings dialogSettingsToSerialize) {
dialogSettingsToSerialize.put("someKey", value);
assertEquals(value, dialogSettingsToSerialize
.getLong("someKey"));
}
@Override
public void checkAfterDeserialization(
IDialogSettings deserializedDialogSettings) {
assertEquals(value, deserializedDialogSettings
.getLong("someKey"));
}
});
}
}
public void testGetSection() {
}
public void testGetSections() {
}
private static interface DialogSettingsChecker {
void prepareAndCheckBeforeSerialization(
IDialogSettings dialogSettingsToSerialize);
void checkAfterDeserialization(
IDialogSettings deserializedDialogSettings);
}
private void testPutAndGet(DialogSettingsChecker dialogSettingsChecker)
throws IOException {
testPutAndGetWithTitle(dialogSettingsChecker, "DialogSettingsTest");
}
private void testPutAndGetWithTitle(
DialogSettingsChecker dialogSettingsChecker, String sectionName)
throws IOException {
IDialogSettings dialogSettingsToSerialize = new DialogSettings(
sectionName);
dialogSettingsChecker
.prepareAndCheckBeforeSerialization(dialogSettingsToSerialize);
StringWriter writer = new StringWriter();
dialogSettingsToSerialize.save(writer);
writer.close();
StringReader reader = new StringReader(writer.getBuffer().toString());
DialogSettings deserializedDialogSettings = new DialogSettings("");
deserializedDialogSettings.load(reader);
dialogSettingsChecker
.checkAfterDeserialization(deserializedDialogSettings);
}
public void testSaveWithIOException() {
final DialogSettings settings = new DialogSettings("test");
try {
settings.save(new BrokenWriter());
fail("IOException expected");
} catch (IOException e) {
}
}
private static class BrokenWriter extends Writer {
@Override
public void write(final char[] cbuf, final int off, final int len)
throws IOException {
throw new IOException("Bang!");
}
@Override
public void close() throws IOException {
throw new IOException("Bang!");
}
@Override
public void flush() throws IOException {
throw new IOException("Bang!");
}
}
}